package com.jinghang.spark_base._010_RDD

import org.apache.spark.{SparkConf, SparkContext}

object _020Rdd_Function_Programming {



  def main(args: Array[String]): Unit = {
      val conf = new SparkConf().setAppName("").setMaster("local[1]")
      val sc = new SparkContext(conf)
      sc.setLogLevel("ERROR")

      /*
        Spark的API在很大程度上依赖于在驱动程序中传递函数以在集群上运行。
        有两种建议的方法可以做到这一点：

          1.匿名函数语法，可用于短代码。
          2.全局单例对象中的静态方法。例如，您可以定义object MyFunctions
              然后传递MyFunctions.func1
     */
    val array = Array(1,2,3,4,5,6)

    val rddNum = sc.parallelize(array)

    val lines = sc.textFile("data/practiceOperator/people.txt")

    //1.匿名函数语法，可用于短代码。
    val lineLengths1 = lines.map(x => x.length)
    val rddnum1 = rddNum.map(x=> x+1)

    //2.全局单例对象中的静态方法。
    val lineLengths2 = lines.map(x => MyFunctions.getLength(x))
    val rddnum2 = rddNum.map(x=> MyFunctions.addOne(x))

    println("lineLengths1")
    lineLengths1.collect().foreach(println)
    println("lineLengths2")
    lineLengths2.collect().foreach(println)
    println("rddnum1")
    rddnum1.collect().foreach(println)
    println("rddnum2")
    rddnum2.collect().foreach(println)
  }

  object MyFunctions {

    def getLength(s: String): Int = {
      s.length
    }

    def addOne(num: Int): Int = {
      num + 1
    }
  }

}
